/**
 * Copyright 2009-2010 rpn4j.org
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.rpn4j;

import java.util.ArrayList;
import java.util.Stack;

import org.rpn4j.core.Function;
import org.rpn4j.core.Operand;
import org.rpn4j.core.Value;
import org.rpn4j.ctx.Context;

/**
 * 1 enter 2 enter +
 * 
 * @author hillger.t
 */
class RpnImpl implements Rpn {
  private Stack<Operand> stack = new Stack<Operand>();
  private Context context;
  
  public void setContext(Context context) {
    this.context = context;
  }
  
  public Context getContext() {
    return this.context;
  }

  public RpnImpl put(double value) {
    stack.push(Value.newInstance(value));
    return this;
  }

  public RpnImpl put(Operand operand) {
    stack.push(operand);
    return this;
  }

  public RpnImpl put(Function function) {
    function.set(new ArrayList<Operand>(stack));
    stack.removeAllElements();
    stack.push(Value.newInstance(function.get()));
    return this;
  }

  public void reset() {
    this.stack.clear();
  }

  public double calculate() {
    return stack.peek().get();
  }
}
